home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_3
/
phoonsrc
/
original
/
xphoon.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-04
|
8KB
|
309 lines
#ifndef lint
static char rcsid[] =
"@(#) $Header: /src/X11/contrib/demos/xphoon/RCS/xphoon.c,v 1.4 90/06/27 10:31:31 tim Exp $ (LBL)";
#endif
/*
** Copyright (C) 1988 by Jef Poskanzer and Craig Leres.
**
** Permission to use, copy, modify, and distribute this software and its
** documentation for any purpose and without fee is hereby granted, provided
** that the above copyright notice appear in all copies and that both that
** copyright notice and this permission notice appear in supporting
** documentation. This software is provided "as is" without express or
** implied warranty.
*/
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#define BitmapSize(w,h) ((((w)+7)/8)*(h))
#include <stdio.h>
#include <math.h>
#include "tws.h"
char *argv0;
int blackflag = 0;
int demoflag = 0;
Display *dpy = NULL;
char *malloc();
main(argc, argv)
int argc;
char **argv;
{
char *display = NULL;
int w, h, cx, cy, r;
int size;
char *bits, *xbits;
int delayminutes = 0;
argv0 = argv[0];
again:
if (argc > 1 && strcmp(argv[1], "-b") == 0) {
argv++;
argc--;
blackflag = 1;
goto again;
}
if (argc > 1 && strcmp(argv[1], "-d") == 0) {
argv++;
argc--;
demoflag = 1;
goto again;
}
if (argc > 2 && strcmp(argv[1], "-t") == 0) {
argv++;
argc--;
if (sscanf(argv[1], "%d", &delayminutes) != 1)
goto usage;
argv++;
argc--;
goto again;
}
if (argc > 2 && strcmp(argv[1], "-x") == 0) {
argv++;
argc--;
if (sscanf(argv[1], "%d", &cx) != 1)
goto usage;
argv++;
argc--;
goto again;
}
if (argc > 2 && strcmp(argv[1], "-y") == 0) {
argv++;
argc--;
if (sscanf(argv[1], "%d", &cy) != 1)
goto usage;
argv++;
argc--;
goto again;
}
if (argc > 2 && strcmp(argv[1], "-display") == 0) {
argv++;
argc--;
display = argv[1];
argv++;
argc--;
goto again;
}
if (argc > 1) {
usage:
fprintf(stderr,
"usage: %s [-b] [-t minutes] [-display display]\n", argv0);
exit(1);
}
if ((dpy = XOpenDisplay(display)) == 0) {
fprintf(stderr, "%s: Can't open display \"%s\"\n",
argv0, XDisplayName(display));
exit(1);
}
w = DisplayWidth(dpy, DefaultScreen(dpy));
h = DisplayHeight(dpy, DefaultScreen(dpy));
checkbitmapsize(&w, &h);
size = BitmapSize(w, h);
bits = (char *)malloc(size);
getbitmap(w, h, bits, &cx, &cy, &r);
if (delayminutes <= 0 && ! demoflag) {
hackbits(dtwstime(), w, h, bits, cx, cy, r);
setroot(w, h, bits);
XCloseDisplay(dpy);
exit(0);
}
xbits = (char *)malloc(size);
for (;;) {
bcopy((char *)bits, (char *)xbits, size);
hackbits(dtwstime(), w, h, xbits, cx, cy, r);
setroot(w, h, xbits);
if ( demoflag )
sleep(1); /* continuous mode */
else
sleep(delayminutes * 60);
}
/* NOTREACHED */
}
setroot(w, h, bits)
int w, h;
char *bits;
{
Pixmap bitmap;
Pixmap pixmap;
GC gc;
XGCValues gcv;
unsigned long length, after;
int format;
Atom prop, type;
unsigned char *data;
bitmap = XCreateBitmapFromData(dpy, DefaultRootWindow(dpy), bits, w, h);
if (bitmap == 0) {
fprintf(stderr, "%s: Unable to store Bitmap", argv0);
exit(1);
}
gcv.foreground = BlackPixel(dpy,DefaultScreen(dpy));
gcv.background = WhitePixel(dpy,DefaultScreen(dpy));
gc = XCreateGC(
dpy, DefaultRootWindow(dpy), GCForeground|GCBackground, &gcv);
pixmap = XCreatePixmap(
dpy, DefaultRootWindow(dpy), w, h,
DefaultDepth(dpy, DefaultScreen(dpy)));
if (pixmap == 0) {
fprintf(stderr, "%s: Unable to create Pixmap", argv0);
exit(1);
}
XCopyPlane(dpy, bitmap, pixmap, gc, 0, 0, w, h, 0, 0, 1L);
XSetWindowBackgroundPixmap(dpy, DefaultRootWindow(dpy), pixmap);
XFreeGC(dpy, gc);
XFreePixmap(dpy, bitmap);
XFreePixmap(dpy, pixmap);
XClearWindow(dpy, DefaultRootWindow(dpy));
XFlush(dpy);
/* Not sure what this garbage does, but xsetroot has it, so... */
prop = XInternAtom(dpy, "_XSETROOT_ID", False);
(void) XGetWindowProperty(
dpy, DefaultRootWindow(dpy), prop, 0L, 1L, True, AnyPropertyType,
&type, &format, &length, &after, &data);
if ((type == XA_PIXMAP) && (format == 32) &&
(length == 1) && (after == 0))
XKillClient(dpy, *((Pixmap *)data));
else if (type != None)
fprintf(stderr, "%s: warning: _XSETROOT_ID property is garbage\n",
argv0);
XFlush(dpy);
}
#ifdef notdef
short leftmask[16] = {
0xffff, 0xfffe, 0xfffc, 0xfff8, 0xfff0, 0xffe0, 0xffc0, 0xff80,
0xff00, 0xfe00, 0xfc00, 0xf800, 0xf000, 0xe000, 0xc000, 0x8000,
};
short rightmask[16] = {
0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f,
0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff,
};
#endif notdef
static char leftmask[8] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80};
static char rightmask[8] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f};
static char shade_0_bits[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
static char shade_1_bits[] = {0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
static char shade_2_bits[] = {0xfe,0xff,0xfb,0xff,0xff,0xff,0xff,0xff};
static char shade_3_bits[] = {0xfe,0xff,0xfb,0xff,0x7f,0xff,0xff,0xff};
static char shade_4_bits[] = {0xfe,0xff,0xfb,0xff,0x7f,0xff,0xff,0xef};
static char shade_5_bits[] = {0xfe,0xbf,0xfb,0xff,0x7f,0xff,0xff,0xef};
static char shade_6_bits[] = {0xfe,0xbf,0xfb,0xdf,0x7f,0xff,0xff,0xef};
static char shade_7_bits[] = {0xfe,0xbf,0xfb,0xdf,0x7f,0xff,0xfe,0xef};
static char shade_8_bits[] = {0xfe,0xbf,0xfb,0xdf,0x7f,0xdf,0xfe,0xef};
static char shade_9_bits[] = {0xfe,0xbf,0xfb,0xdf,0x7d,0xdf,0xfe,0xef};
static char shade_10_bits[] = {0xfe,0xbf,0xfb,0xdf,0x7d,0xdf,0xfa,0xef};
static char shade_11_bits[] = {0xfe,0xbf,0xfb,0xdf,0x7d,0xdf,0xfa,0xaf};
static char shade_12_bits[] = {0xfe,0xbf,0xfa,0xdf,0x7d,0xdf,0xfa,0xaf};
static char shade_13_bits[] = {0xfe,0xaf,0xfa,0xdf,0x7d,0xdf,0xfa,0xaf};
static char shade_14_bits[] = {0xfe,0xaf,0xfa,0xdf,0x75,0xdf,0xfa,0xaf};
static char shade_15_bits[] = {0xfa,0xaf,0xfa,0xdf,0x75,0xdf,0xfa,0xaf};
char *shades[16] = {
shade_0_bits, shade_1_bits, shade_2_bits, shade_3_bits,
shade_4_bits, shade_5_bits, shade_6_bits, shade_7_bits,
shade_8_bits, shade_9_bits, shade_10_bits, shade_11_bits,
shade_12_bits, shade_13_bits, shade_14_bits, shade_15_bits };
#define PI 3.14159265358979323846 /* Assume not near black hole or in
Tennessee */
double jtime(), phase();
hackbits(t, w, h, bits, cx, cy, r)
struct tws *t;
int w, h;
char *bits;
int cx, cy, r;
{
double jd, angphase, cphase, aom, cdist, cangdia, csund, csuang;
int i;
register int x, y;
int xleft, xright;
double fxleft, fxright;
double fy;
int wxright, bxright, wxleft, bxleft;
int off;
double cap, ratio;
int shadeindex;
char shade;
static double demoinc = 0.0;
jd = jtime( t );
if ( demoflag ) {
/* Jump ahead a day each time through. */
jd += demoinc;
demoinc += 1.0;
}
angphase = phase( jd, &cphase, &aom, &cdist, &cangdia, &csund, &csuang);
cap = cos( angphase );
/* Hack to figure approximate earthlighting. */
if ( cphase < 0.1 ) cphase = 0.1;
if ( cphase > 0.9 ) cphase = 0.9;
ratio = (1.0 - cphase) / cphase; /* ratio varies from 9.0 to 0.111 */
shadeindex = (int) ( ratio / 9.0 * 15.9999 );
#ifdef DEBUG
printf("angphase %f, cap %f\n", angphase, cap);
#endif
for (i = 0; i < 2 * r; i++) {
y = cy - r + i;
fy = i - r;
fxright = r * sqrt(1.0 - (fy * fy) / (r * r));
fxleft = - fxright;
if (angphase >= 0.0 && angphase < PI)
fxright *= cap;
else
fxleft *= cap;
xright = fxright + cx;
xleft = fxleft + cx;
wxright = xright / 8;
bxright = xright % 8;
wxleft = xleft / 8;
bxleft = xleft % 8;
off = y * ((w + 7) / 8);
if ( blackflag )
shade = 0xff;
else
shade = shades[shadeindex][y % 8];
if (wxleft == wxright)
bits[wxleft + off] |=
leftmask[bxleft] & shade & rightmask[bxright];
else {
bits[wxleft + off] |= leftmask[bxleft] & shade;
for (x = wxleft + 1; x < wxright; x++)
bits[x + off] |= shade;
bits[wxright + off] |= rightmask[bxright] & shade;
}
}
}